﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;

namespace System.Windows
{
    public static class MessageQueueHepler
    {/// <summary>
     /// 强制处理UI消息队列
     /// Processes all UI messages currently in the message queue.
     /// </summary> 
        public static void DoEvents()
        {
            try
            {


                // Create new nested message pump.

                DispatcherFrame nestedFrame = new DispatcherFrame();

                // Dispatch a callback to the current message queue, when getting called,

                // this callback will end the nested message loop.

                // note that the priority of this callback should be lower than the that of UI event messages.

                DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(
                                                      DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrame), nestedFrame);

                // pump the nested message loop, the nested message loop will

                // immediately process the messages left inside the message queue.
                Dispatcher.PushFrame(nestedFrame);

                // If the "exitFrame" callback doesn't get finished, Abort it.

                if (exitOperation.Status != DispatcherOperationStatus.Completed)
                {
                    exitOperation.Abort();
                }
            }
            catch (Exception)
            {

            }
        }

        private static Object ExitFrame(Object state)
        {
            DispatcherFrame frame = state as DispatcherFrame;
            // Exit the nested message loop.
            frame.Continue = false;
            return null;
        }
    }
}
